package com.robert.vesta.service.impl.provider;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import com.robert.vesta.util.IpUtils;

public class IpConfigurableMachineIdProvider implements MachineIdProvider {
	private static final Logger log = LoggerFactory
			.getLogger(IpConfigurableMachineIdProvider.class);

	private long machineId;

	private Map<String, Long> ipsMap = new HashMap<String, Long>();

	public IpConfigurableMachineIdProvider() {
		log.debug("IpConfigurableMachineIdProvider constructed.");
	}

	public IpConfigurableMachineIdProvider(String ips) {
		setIps(ips);
		init();
	}

	public void init() {
		String ip = IpUtils.getHostIp();

		if (StringUtils.isEmpty(ip)) {
			String msg = "Fail to get host IP address. Stop to initialize the IpConfigurableMachineIdProvider provider.";

			log.error(msg);
			throw new IllegalStateException(msg);
		}

		if (!ipsMap.containsKey(ip)) {
			String msg = String
					.format("Fail to configure ID for host IP address %s. Stop to initialize the IpConfigurableMachineIdProvider provider.",
							ip);

			log.error(msg);
			throw new IllegalStateException(msg);
		}

		machineId = ipsMap.get(ip);

		log.info("IpConfigurableMachineIdProvider.init ip {} id {}", ip,
				machineId);
	}

	public void setIps(String ips) {
		log.debug("IpConfigurableMachineIdProvider ips {}", ips);
		if (!StringUtils.isEmpty(ips)) {
			String[] ipArray = ips.split(",");

			for (int i = 0; i < ipArray.length; i++) {
				ipsMap.put(ipArray[i], (long) i);
			}
		}
	}

	public long getMachineId() {
		return machineId;
	}

	public void setMachineId(long machineId) {
		this.machineId = machineId;
	}
}
